package study.myself.exception;

import org.junit.Test;

/**
* @Name: ExceptionDemo01
* @Description: 异常处理测试类01——异常捕获及处理，也称为显示处理程序异常
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-14 下午3:35:21 
* @Version: V1.0
 */
public class ExceptionDemo01 {
	
	/**
	* @Name: singleExceptionHandle
	* @Description: 处理单个异常 - 测试一
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午3:46:18
	* @Parameters: 无
	* @Return: void 无
	 */
	@Test
	public void singleExceptionHandle01() {
		int a = 10 ;
		int b = 0 ;
		//前代码 - 执行
		System.out.println("1111");
		try {
			//异常前代码  - 执行
			System.out.println("2222");
			//异常代码  - 执行，发现异常
			System.out.println(a/b);
			//异常后代码 - 不执行
			System.out.println("3333");
		} catch (ArithmeticException e) { //捕获并匹配到异常信息
			//异常处理 - 执行
			System.out.println("除数不能为0！");
		} finally {
			//异常处理后代码 - 执行
			System.out.println("4444");
		}
		//后代码 - 执行
		System.out.println("5555");
	}
	
	/**
	* @Name: singleExceptionHandle
	* @Description: 处理单个异常 - 测试二
	* 注意：第一个catch语句先捕获到异常信息，但不配不成功；接着第二个catch捕获此异常且匹配成功，然后执行其异常处理代码
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午3:46:18
	* @Parameters: 无
	* @Return: void 无
	 */
	@Test
	public void singleExceptionHandle02() {
		int a = 10 ;
		int b = 0 ;
		//前代码 - 执行
		System.out.println("1111");
		try {
			//异常前代码  - 执行
			System.out.println("2222");
			//异常代码  - 执行，发现异常
			System.out.println(a/b);
			//异常后代码 - 不执行
			System.out.println("3333");
		} catch (ArrayIndexOutOfBoundsException e) { //捕获异常信息  - 执行
			//异常处理1 - 不执行
			System.out.println("数组索引越界异常！");
		} catch (ArithmeticException e) { //捕获并匹配到异常信息  - 执行
			//异常处理2 - 执行
			System.out.println("除数不能为0！");
		} finally {
			//异常处理后代码 - 执行
			System.out.println("4444");
		}
		//后代码 - 执行
		System.out.println("5555");
	}
	
	/**
	* @Name: singleExceptionHandle
	* @Description: 处理单个异常 - 测试三
	* 注意：此方法没有捕获到精确的ArithmeticException异常，
	* 此情况下，如果存在该父类异常，则执行父类异常处理代码；如果既不存在此异常捕获，也不存在父类异常捕获，则在控制台输出异常信息。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午3:46:18
	* @Parameters: 无
	* @Return: void 无
	 */
	@Test
	public void singleExceptionHandle03() {
		int a = 10 ;
		int b = 0 ;
		//前代码 - 执行
		System.out.println("1111");
		try {
			//异常前代码  - 执行
			System.out.println("2222");
			//异常代码  - 执行，发现异常
			System.out.println(a/b);
			//异常后代码 - 不执行
			System.out.println("3333");
		} catch (ArrayIndexOutOfBoundsException e) { //捕获异常信息  - 执行
			//异常处理1 - 不执行
			System.out.println("数组索引越界异常！");
		} catch (StringIndexOutOfBoundsException e) { //捕获异常信息  - 执行
			//异常处理2 - 不执行
			System.out.println("字符串索引越界异常！"); 
		} catch (Exception e) { //捕获并匹配到异常信息，但该异常信息为其父类异常  - 执行
			//异常处理3 - 执行
			System.out.println("程序出现异常！");
		}
		finally {
			//异常处理后代码 - 执行
			System.out.println("4444");
		}
		//后代码 - 执行
		System.out.println("5555");
	}
	
	/**
	* @Name: singleExceptionHandle04
	* @Description: 处理单个异常 - 测试四
	* 说明：JDK7新支持的针对多个catch异常捕获语句的或逻辑处理方式；此时，多个异常键必须为平级关系
	* 缺点：异常处理信息不够明确，不过实际开发中，也往往会将同一类型的异常归为一个异常处理
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午4:44:15
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void singleExceptionHandle04() {
		int a = 10 ;
		int b = 0 ;
		//前代码 - 执行
		System.out.println("1111");
		try {
			//异常前代码  - 执行
			System.out.println("2222");
			//异常代码  - 执行，发现异常
			System.out.println(a/b);
			//异常后代码 - 不执行
			System.out.println("3333");
		} catch (ArrayIndexOutOfBoundsException | StringIndexOutOfBoundsException | ArithmeticException e) { //捕获并逐个匹配异常信息
			//异常处理 - 执行
			System.out.println("程序出现运行时异常！");
		} finally {
			//异常处理后代码 - 执行
			System.out.println("4444");
		}
		//后代码 - 执行
		System.out.println("5555");
	}
	
	/**
	* @Name: multipleExceptionHandle01
	* @Description: 处理多个异常（平行异常）——测试一
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午3:56:40
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void multipleExceptionHandle01() {
		int a = 1 ;
		int b = 0 ;
		//前代码 -执行
		System.out.println("1111");
		try {
			//异常前代码 -执行
			System.out.println("2222");
			//异常代码 - 执行，发现异常
			System.out.println(a/b);
			//异常后代码 - 不执行
			System.out.println("3333");
		} catch (ArithmeticException e) { //捕获并匹配到异常信息 - 执行
			//异常处理  -执行
			System.out.println("除数不能为0!");
		} finally {
			//异常处理后代码  -执行
			System.out.println("4444");
		}
		//后代码  -执行
		System.out.println("5555");
		int[] arr = {1, 2, 3} ;
		//前代码  -执行
		System.out.println("6666");
		try {
			//异常前代码  -执行
			System.out.println("7777");
			//异常代码 - 执行，发现异常
			System.out.println(arr[3]);
			//异常后代码  - 不执行
			System.out.println("8888");
		} catch (ArrayIndexOutOfBoundsException e) { //捕获并匹配到异常信息 - 执行
			//异常处理  -执行
			System.out.println("数组索引越界异常！");
		} finally {
			//异常处理后代码  -执行
			System.out.println("9999");
		}
		//后代码  -执行
		System.out.println("over");
	}
	
	/**
	* @Name: multipleExceptionHandle02
	* @Description: 处理多个异常（平行异常）——测试二
	* 注意：此方法仅执行了异常1，而没有执行到异常2
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午3:57:28
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void multipleExceptionHandle02() {
		int a = 10 ;
		int b = 0 ;
		int[] arr = {1, 2, 3} ;
		//前代码  -执行
		System.out.println("1111");
		try {
			//异常前代码  -执行
			System.out.println("2222");
			//异常代码1 - 执行，发现异常
			System.out.println(a/b);
			//异常代码1后代码  - 不执行
			System.out.println("3333");
			//异常代码2 - 不执行
			System.out.println(arr[3]);
			//异常代码2后代码 - 不执行
			System.out.println("4444");
		} catch (ArithmeticException e) { //捕获并匹配到异常信息
			//异常处理1
			System.out.println("除数不能为0！");
		} catch (ArrayIndexOutOfBoundsException e) { //捕获异常信息 - 不执行
			//异常处理2 - 不执行
			System.out.println("数组索引越界异常！");
		} finally {
			//异常处理后代码 - 执行
			System.out.println("7777");
		}
		//后代码 - 执行
		System.out.println("8888");
	}
	
	/**
	* @Name: multipleExceptionHandle03
	* @Description: 处理多个异常（嵌套异常）- 测试三
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-14 下午4:32:20
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void multipleExceptionHandle03() {
		int a = 10 ;
		int b = 0 ;
		int[] arr = {1, 2, 3} ;
		//前代码 - 执行
		System.out.println("1111");
		try {
			//异常1前代码 - 执行
			System.out.println("2222");
			//异常代码1 - 执行
			System.out.println(a/b);
			//异常1后代码 - 不执行
			System.out.println("3333");
		} catch (ArithmeticException e) { //捕获异常1异常信息  - 执行
			//异常1处理代码 - 执行
			System.out.println("除数不能为0！");
			try {
				//异常2前代码 - 执行
				System.out.println("5555");
				//异常代码2 - 执行
				System.out.println(arr[3]);
				//异常2后代码 - 不执行
				System.out.println("6666");
			} catch (Exception e2) { //捕获异常2异常信息  - 执行
				//异常2处理代码 - 执行
				System.out.println("数组索引越界异常！");
			} finally {
				//异常2处理后代码  -执行
				System.out.println("7777");
			}
		} finally {
			//异常1处理后代码  -执行
			System.out.println("8888");
		}
		//后代码 - 执行
		System.out.println("9999");
	}
}
